home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Headline 1
/
Headline 1.adf
/
HDLfiles
/
inconvex.stc
/
inconvex
Wrap
Text File
|
1992-09-02
|
4KB
|
120 lines
±12 Inconvex Vector Objects
±13-------------------------------------
±12by Aragorn/Avalon
±11After a while you probably get bored
just working with plain convex vector
routines, because of the few
opportunities they give you to design
objects. So what you have to do then
is to fix your routine a little bit
so that it's able to handle inconvex
objects. And that should open a new
horizon for you and let you create
much more interesting objects.
First of all you need a normal hidden
line vector routine to start out
with. And as you know, in a convex
routine you draw the lines directly
in the screenbuffer, and that works
fine since there is no intreference
with more than one surface over the
same area. However, when you are
working with inconvex objects, this
overlapping will occur. What you
have to do then is to draw all the
lines for one surface in a separate
buffer, then fill the buffer, and
blit it out on the screen. Then you
clear the buffer, and do it over
again until you have taken care of
all the surfaces. Now, that is just
a really simple way of saying it, so
let's get a little deeper into what
needs to be done...
In addition to your screenbuffers you
will need another buffer big enough
for one bitplane in screen size
(usually [256*40]=10240 bytes). This
is where you'll draw and fill all
your surfaces separately before
blitting them onto the screen where
the complete object will be created
and shown. Since the surface buffer
(the one explained above) is only in
one bitplane, you'll have to label
every surface in the declarations
with the bitplanes you want it to be
shown in. Here is an example on such
a declaration:
±12dc.w %10,0,1,1,2,2,3,3,0,-1
±11Here, the first word shows which
bitplanes the surface will be shown
in. Then comes the coordinates the
surface is drawn between (from,to,
from,to...) and the last word marks
end of surface. Then, after filling
the surface it's time to blit it.
Let's say you have the first word
"%10" in d0. You simply test the
bits in d0 to find where to blit the
surface. And remember to clear the
area which the surface covers in the
bitplanes where it is not blitted
out! Let's look at an example:
±13btst #0,d0 ; Draw Bpl1? [No]
beq .No1 ; If No, Skip It!
(BLIT SURFACE IN 1. BITPLANE)
btst #1,d0 ; Draw Bpl2?
bne .No1 ; If No, Clear It!
(CLEAR SURFACE'S AREA IN 2. BITPLANE)
.No1:
btst #1,d0 ; Draw Bpl2? [Yes]
beq .No2 ; If No, Skip It!
(BLIT SURFACE IN 2. BITPLANE)
btst #0,d0 ; Draw Bpl1? [No]
bne .No2 ; If No, Clear It!
(CLEAR SURFACE'S AREA IN 1. BITPLANE)
.No2:
±11The answers in the brackets will go
for the "%10" combination. Now all
you need to do is to clear the
surface-buffer and repeat the cycle
until all the surfaces have been
processed. And then your object is
complete!
"Now wait a minute", you might say;
"how can I make sure that the
surfaces are blitted out in the right
order?". Well, since there is no
routine that sorts the surfaces as
they rotate and gets them in the
right order, we'll have to pre-
arrange the surfaces. That is done
down in the declarations. The
easiest way of explaining how to do
that is just to switch around the
orders the surfaces are declared in
until it works. But here are some
guidelines that you might find handy:
±13*±11 Declare the surfaces that are over,
in front of, or outside the others
at the end.
±13*±11 Declare the surfaces that are shown
in all bitplanes last, or first.
±12Well, that is all I have to say about
inconvex vector objects in this
article. Good luck with your
experiments!
±13 Aragorn/Avalon...ç